/*
 * bufffer.c
 *
 *  Created on: 2013. 7. 24.
 *      Author: Shim
 */


#include <stdlib.h>
#include "buffer.h"

int32_t bufferInit(BUFFER* buffer, int32_t len)
{
	buffer->len = len;
	buffer->buf = malloc(len);
	buffer->head = 0;
	buffer->tail = 0;
	buffer->used = 0;

	return 0;
}
int32_t bufferDeinit(BUFFER* buffer)
{
	free(buffer->buf);
	return 0;
}

int32_t	bufferRead(BUFFER* buffer, int8_t* data)
{
	int32_t ret = 0;
	if(isBufferEmpty(buffer) ) {
		ret =  BUF_ERR_UNDERFLOW;
	} else {
		*data = buffer->buf[buffer->head];
		buffer->head++;
		buffer->used--;
		if(buffer->head == buffer->len) { /**< head가 배열 인덱스를 넘어가면 배열의 0번째 위치를 지시하도록 한다. */
			buffer->head = 0;
		}
	}
	return ret;
}

int32_t bufferWrite(BUFFER* buffer, int8_t data)
{
	int32_t ret = 0;
	if(isBufferFull(buffer))
	{
		ret =  BUF_ERR_OVERFLOW;
	} else {
		buffer->buf[buffer->tail] = data;
		buffer->tail++;
		buffer->used++;
		if(buffer->tail == buffer->len) { /**< tail이 배열 인덱스를 넘어가면 배열의 0번째 위치를 지시하도록 한다. */
			buffer->tail = 0;
		}
	}
	return ret;
}
int32_t isBufferEmpty(BUFFER* buffer)
{
	if(getBufferUsedSize(buffer) == 0)	/**< head와 tail이 같다는 것은 버퍼가 비어있다는 것이다. */
		return 1;
	else
		return 0;
}
int32_t isBufferFull(BUFFER* buffer)
{
	if(getBufferUsedSize(buffer) == buffer->len)
		return 1;
	else
		return 0;
}
int32_t getBufferUsedSize(BUFFER* buffer)
{
	return buffer->used;
}
